#include <ultrasonic.h>
#include <intrins.h>

sbit Tx = P1^0;
sbit Rx = P1^1;

void Delay12us(void)	//@12.000MHz
{
	unsigned char data i;

	_nop_();
	_nop_();
	i = 40;
	while (--i);
}


void Ut_Wave_Init()
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        Tx = 1;
        Delay12us();
        Tx = 0;
        Delay12us();
    }
    Tx = 0;  // 确保最后保持低电平
}

unsigned char Ut_Wave_Data()  //超声波距离读取函数
{
    unsigned int _time;//时间储存变量
	
	
    TMOD &= 0x0f;//配置定时器1计时模式
    TH1 = TL1 = 0;//复位计数值 等待超声波信号发出
     EA = 0;
		Ut_Wave_Init();//发送超声波信号
   EA = 1;  
	TR1 = 1;//开始计时
    while((Rx == 1) && (TF1 == 0));//等待接受返回信号或者定时器溢出
    TR1 = 0;//停止计时
	
    if(TF1 == 0) //定时器没有溢出
    {
        _time = TH1 << 8 | TL1;//读取当前时间
        return (_time * 0.017);//返回距离值
    }
    else
    {
        TF1 = 0;//清除溢出标志位
        return 0;
    }
}

 

unsigned int Ut_Wave_Data_PCA()
{
    unsigned int time;       // 用于存储测量到的时间差
    CMOD = 0x00;            // 配置PCA定时器模式 (Sysclk/12)
    CCON = 0X00;            // 初始化CCON寄存器
    CH = CL = 0;            // 复位PCA定时器计数值
    EA = 0;  
    Ut_Wave_Init();           // 发送8个40kHz的超声波脉冲
    EA = 1; 
		CR = 1;                 // 启动PCA定时器
                   // 暂时关闭全局中断
    
    // 等待接收返回信号或定时器溢出
    while((Rx == 0) && (CF==0));
    while(Rx && (CF==0));
    
    CR = 0;         // 停止PCA定时器
               
    
    if(CF==0) {
        time = CH << 8 | CL;
        return (unsigned int)(time * 0.01724f);  // 显式类型转换
    }
    else {
        CF = 0;
        return 0x0;
    }
}
